/*
 *  Copyright 2015-2016, RenGu Technology (BeiJing) Co., Ltd.
 *  All right reserved.
 *
 *  THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF RENGU TECHNOLOGY (BeiJing) CO., LTD.
 *
 *  THE CONTENTS OF THIS FILE MAY NOT BE DISCLOSED TO THIR PARTIES,
 *  COPIED OR DUPLICATED IN ANY FORM, IN WHOLE OR IN PART,
 *  WITHOUT THE PRIOR WRITTEN PERMISSION OF RENGU TECHNOLOGY (BeiJing) CO., LTD.
 *
 *  AcctDetailMapper
 *
 *  Edit History:
 *      lizhangtao Created on 2020年04月12日
 *
 */
package cc.rengu.igas.acct.common.dao;

import cc.rengu.igas.acct.common.entity.AcctDetail;
import cc.rengu.oltp.service.model.BizException;
import cc.rengu.oltp.utility.bean.PageResult;
import cc.rengu.oltp.utility.util.DbsUtil;

import java.util.List;

/**
 * 虚拟账户记账明细操作接口
 *
 * @author lizhangtao
 * @version 1.0
 * @date 2020/5/8
 */
public interface AcctDetailMapper {


    /**
     * 登记记账明细
     *
     * @param acctDetail 账户记账明细
     * @param dbsUtil    数据库操作句柄
     * @return Database.DBS_SUCCESS成功，
     * Database.DBS_PKEY_DUPLICATE主键重复，
     * 违反唯一约束需要自己判断，其他失败
     * 为区别普通的数据库返回的应答码及异常，异常时返回Integer.MIN_VALUE
     */
    int insert2AcctDetail(AcctDetail acctDetail, DbsUtil dbsUtil);

    /**
     * 以记账流水查询原记账明细
     *
     * @param instId     法人机构号
     * @param acctSeqNum 记账流水号
     * @return 成功返回记账明细，未查询到数据返回null
     * @throws BizException 其他失败及异常抛出异常
     */
    AcctDetail selectAcctDetailByAcctSeqNum(String instId, String acctSeqNum) throws BizException;

    /**
     * 以交易上送的外部流水查询原记账明细
     *
     * @param instId      法人机构号
     * @param transSeqNum 记账流水号
     * @return 成功返回记账明细，未查询到数据返回null
     * @throws BizException 其他失败及异常抛出异常
     */
    AcctDetail selectAcctDetailByTransSeqNum(String instId, String transSeqNum) throws BizException;

    /**
     * 更新原明细为已经撤销
     *
     * @param instId         法人机构号
     * @param origAcctSeqNum 原记账流水号
     * @param fronSeqNum     预授权撤销交易的外部流水号
     * @param acctSeqNum     预授权撤销交易的记账流水号
     * @param dbsUtil        数据库操作句柄
     * @throws BizException 无数据、失败、异常
     */
    void updOrigCanceledByAcctSeqNum(String instId, String origAcctSeqNum, String fronSeqNum, String acctSeqNum, DbsUtil dbsUtil) throws BizException;

    /**
     * 更新原明细为已经完成
     *
     * @param instId         法人机构号
     * @param origAcctSeqNum 原记账流水号
     * @param fronSeqNum     预授权完成交易的外部流水号
     * @param acctSeqNum     预授权完成交易的记账流水号
     * @param dbsUtil        数据库操作句柄
     * @throws BizException 无数据、失败、异常
     */
    void updOrigCompletedByAcctSeqNum(String instId, String origAcctSeqNum, String fronSeqNum, String acctSeqNum, DbsUtil dbsUtil) throws BizException;

    /**
     * 指定账号查询日期时间段内按照交易时间正序排列的某指定区间的所有交易
     *
     * @param instId     法人机构号
     * @param acctNo     账号
     * @param startDate  开始日期（包括）
     * @param endDate    截止日期（包括）
     * @param numPerPage 每页记录数
     * @param pageNo     查询指定某页
     * @return 记账明细实体list及页数信息，无数据返回null
     * @throws BizException 其他失败或者异常抛出异常
     */
    PageResult fetchPageListByAcctNoAndStartEndDate(String instId, String acctNo, String startDate, String endDate,
                                                    int numPerPage, int pageNo) throws BizException;

    /**
     * 指定客户号查询日期时间段内按照交易时间正序排列的某指定区间的所有交易
     *
     * @param instId     法人机构号
     * @param customerId 客户号
     * @param startDate  开始日期（包括）
     * @param endDate    截止日期（包括）
     * @param numPerPage 每页记录数
     * @param pageNo     查询指定某页
     * @return 记账明细实体list及页数信息，无数据返回null
     * @throws BizException 其他失败或者异常抛出异常
     */
    PageResult fetchPageListByCustomerIdAndStartEndDate(String instId, String customerId, String startDate, String endDate,
                                                        int numPerPage, int pageNo) throws BizException;

    /**
     * 指定外部用户查询日期时间段内按照交易时间正序排列的某指定区间的所有交易
     *
     * @param instId     法人机构号
     * @param userType   外部用户类型
     * @param userId     外部用户id
     * @param startDate  开始日期（包括）
     * @param endDate    截止日期（包括）
     * @param numPerPage 每页记录数
     * @param pageNo     查询指定某页
     * @return 记账明细实体list及页数信息，无数据返回null
     * @throws BizException 其他失败或者异常抛出异常
     */
    PageResult fetchPageListByUserAndStartEndDate(String instId, String userType, String userId, String startDate, String endDate,
                                                  int numPerPage, int pageNo) throws BizException;

    /**
     * 指定外部调用方原请求流水号查询所有
     *
     * @param instId      法人机构号
     * @param frontSeqNum 外部调用方流水号
     * @return List<AcctDetail> 记账明细实体list及，无数据返回null
     * @throws BizException 其他失败或者异常抛出异常
     */
    List<AcctDetail> fetchListByFrontSeqNum(String instId, String frontSeqNum) throws BizException;

    /**
     * 使用外部原请求流水号查询记账明细
     *
     * @param userId
     * @param customerId
     * @param traceNo
     * @param instId
     * @return 原则上该方式查询不到数据认为没记账，查询到一条数据，需判断状态是否记账成功；查询到多条数据说明记账存在问题
     */
    AcctDetail selectAcctDetailByFromSeqNumCustomerIdAndUserId(String userId, String userType, String acctNo, String customerId, String traceNo, String instId);

    /**
     * 使用预授权冻结流水作为原交易查询对应预授权完成或预授权撤销交易流水
     *
     * @param instId
     * @param freezeAcctSeqNum
     * @param acctNo
     * @param customerId
     * @param userType
     * @param userId
     * @return
     */
    List<AcctDetail> fetchListByOrigAcctSeqNum(String instId, String freezeAcctSeqNum, String acctNo, String customerId, String userType, String userId);
}
